import router from "@/router";
import NProgress from "nprogress";
import "nprogress/nprogress.css";
import { useUserStore } from "@/store/user.ts";
import { usePermissionStore } from "@/store/permission.ts";

NProgress.configure({ showSpinner: false }); // 进度条

const whiteList = ["/login", "/register"];

router.beforeEach((to, from, next) => {
  NProgress.start();
  const hasToken = sessionStorage.getItem("token");
  if (hasToken) {
    if (to.path === "/login") {
      // 如果已登录，跳转首页
      next({ path: "/" });
      NProgress.done();
    } else if (whiteList.indexOf(to.path) !== -1) {
      next();
    } else {
      if (!useUserStore().userInfo || Object.keys(useUserStore().userInfo) .length == 0) {
        const hasRoute = router.hasRoute(to.name!);
        // 等到拉取完用户信息和权限菜单之后，生成动态路由。
        Promise.all([
            useUserStore().getUserInfo(),
            useUserStore().getPermMenus(),
          ]).then(([userInfo, { perms, menus }]) => {
            useUserStore().setUserInfo(userInfo);
            useUserStore().setPerms(perms);
            usePermissionStore().generatorRouters(menus);
            if (!hasRoute) {
              // 如果该路由不存在，可能是动态注册的路由，它还没准备好，需要再重定向一次到该路由。
              // 若控制台出现警告“No match found for location with path ‘xxx'”，就在路由文件中添加404路由
              // 如果参数to不能找到对应的路由的话，就再执行一次beforeEach((to, from, next))直到其中的next({ ...to})能找到对应的路由为止。
              next({ ...to, replace: true }); //告诉VUE本次操作后，不能通过浏览器后退按钮，返回前一个路由。
            } else {
              // 上述if分支中next({...to,replace:true})只是中断了路由，这里必须要next()才能继续执行路由,否则会陷入无限循环
              next();
            }
        }).catch(err => {
          console.log(err);
          next();
        })
      } else {
        next();
      }
      NProgress.done();
    }
  } else {
    // 未登录可以访问白名单页面
    if (whiteList.indexOf(to.path) !== -1) {
      next();
    } else {
      next(`/login?redirect=${to.path}`);
      NProgress.done();
    }
  }
});

router.afterEach(() => {
  NProgress.done();
});
